package service

import (
	"encoding/json"
	"canliancontract/common"
	"canliancontract/log"
	"canliancontract/module"
	"github.com/hyperledger/fabric/core/chaincode/shim"
	"fmt"
)

func toRegister(stub shim.ChaincodeStubInterface, param map[string]interface{}) (tChan module.OnChainInfo) {

	tChan.Hash = param["hash"].(string)
	tChan.Key = int(param["oid"].(float64))
	//tChan.Hash = stub.GetTxID()
	log.Logger.Info("TxID " + stub.GetTxID())
	log.Logger.Info("hash",param["hash"])
	fmt.Println(param)
	log.Logger.Info("hash",param["hash"])
	txList := make(map[string]interface{})
	blockTx := module.BlockTx{}

	// 判断type字段是否存在
	if _, ok := param["type"]; !ok {
		log.Logger.Error("no type field")
		tChan.Status = false
		tChan.ErrorCode = common.ERR["CHAINERR"]
		return tChan
	}

	// 判断city字段是否存在
	if _, ok := param["city"]; !ok {
		log.Logger.Error("no city field")
		tChan.Status = false
		tChan.ErrorCode = common.ERR["CHAINERR"]
		return
	}

	//param["unixtime"] = time.Now().Unix()

	//param["time"] = time.Now().Format("2006-01-02 15:04:05")

	//log.Logger.Info("time:",param["time"])
	//param["hash"] = stub.GetTxID()

	jsonByte, err := json.Marshal(param)
	if err != nil { //序列化出错
		log.Logger.Error("goRegister -- marshal product err:" + err.Error() + "	TxHash:" + tChan.Hash)
		tChan.Status = false
		tChan.ErrorCode = common.ERR["CHAINERR"]
		return
	}

	txList["time"] = param["operate_time"]
	log.Logger.Info("time：",txList["time"])
	txList["hash"] = param["hash"]

	log.Logger.Info("hash",param["hash"].(string))
	txList["txType"] = param["type"]

	blockTx.BlockTx = txList
	blockTxByte, _ := json.Marshal(blockTx)

	//把type 字段转换为int
	code := int(param["type"].(float64))
	switch code {
	case 0: // 残疾人信息上链   以证件编号为 key值
		tChan.Type = "0"
		//tChan.Key = param["disability_certificate_no"].(string)

		b, err := stub.GetState(common.TXHASH + common.ULINE + param["hash"].(string))
		if err != nil {
			log.Logger.Info("查询数据库失败")
			tChan.Status = false
			tChan.ErrorCode = common.ERR["CHAINERR"]
			return
		}
		if b != nil { //残疾人信息已经存在链上
			log.Logger.Info("交易信息已经存在链上，不可重复上链")
			tChan.Status = false
			tChan.ErrorCode = common.ERR["CHAINERR"]
			return
		}
		err = stub.PutState(common.TXHASH+common.ULINE+txList["hash"].(string), jsonByte)
		if err != nil {
			log.Logger.Error("TxList putState error")
		}

		//判断残疾人信息是否在链上已经存在
		err = stub.PutState(common.ALL_TX_IN_BLOCK+common.ULINE+txList["hash"].(string), blockTxByte)
		if err != nil {
			log.Logger.Error("TxList putState error")
		}
		//统计对应城市残疾人数目
		//cityDisabilityNum(stub, param)
		//上链

		fmt.Println("【【success】】", param)
		tChan.Status = true
		tChan.ErrorCode = common.ERR["NONE"]
		//recordDisabilityTxNumber(stub)
		return
	case 1: // 康复机构信息上链     以康复机构名为key值
		tChan.Type = "1"
		//tChan.Key = param["name"].(string)

		b, err := stub.GetState(common.TXHASH + common.ULINE + param["hash"].(string))
		if err != nil {
			log.Logger.Info("查询数据库失败")
			tChan.Status = false
			tChan.ErrorCode = common.ERR["CHAINERR"]
			return
		}
		if b != nil { //残疾人信息已经存在链上
			log.Logger.Info("交易信息已经存在链上，不可重复上链")
			tChan.Status = false
			tChan.ErrorCode = common.ERR["CHAINERR"]
			return
		}
		err = stub.PutState(common.TXHASH+common.ULINE+txList["hash"].(string), jsonByte)
		if err != nil {
			log.Logger.Error("TxList putState error")
		}

		err = stub.PutState(common.ALL_TX_IN_BLOCK+common.ULINE+txList["hash"].(string), blockTxByte)
		if err != nil {
			log.Logger.Error("TxList putState error")
		}

		//地图数据城市康复机构数据统计
		//cityRehabilitationNum(stub, param)
		//上链

		fmt.Println("【【success】】", param)
		tChan.Status = true
		tChan.ErrorCode = common.ERR["NONE"]
		//recordRehabilitationTxNumber(stub)
		return
	case 2: // 补贴申请信息上链

		tChan.Type = "2"
		//tChan.Key = param["disability_certificate_no"].(string)
		
		b, err := stub.GetState(common.TXHASH + common.ULINE + param["hash"].(string))
		if err != nil {
			log.Logger.Info("查询数据库失败")
			tChan.Status = false
			tChan.ErrorCode = common.ERR["CHAINERR"]
			return
		}
		if b != nil { //残疾人信息已经存在链上
			log.Logger.Info("交易信息已经存在链上，不可重复上链")
			tChan.Status = false
			tChan.ErrorCode = common.ERR["CHAINERR"]
			return
		}
		err = stub.PutState(common.TXHASH+common.ULINE+txList["hash"].(string), jsonByte)
		if err != nil {
			log.Logger.Error("TxList putState error")
		}


		err = stub.PutState(common.ALL_TX_IN_BLOCK+common.ULINE+txList["hash"].(string), blockTxByte)
		if err != nil {
			log.Logger.Error("TxList putState error")
		}

		//地图数据城市康复救助数据统计
		//citySubsidyNum(stub, param)
		//上链

		fmt.Println("【【success】】", param)
		tChan.Status = true
		tChan.ErrorCode = common.ERR["NONE"]
		//recordSubsidyTxNumber(stub)
		return

	default: // 数据错误
		log.Logger.Error("上链数据类型不正确，请确认数据")
		tChan.Status = false
		tChan.ErrorCode = common.ERR["CHAINERR"]
		return
	}
}

